package main

import "fmt"

/*
扑克牌中的顺子
从若干副扑克牌中随机抽 5 张牌，判断是不是一个顺子，即这5张牌是不是连续的。2～10为数字本身，
A为1，J为11，Q为12，K为13，而大、小王为 0 ，可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True

示例 2:
输入: [0,0,1,2,5]
输出: True
*/

func isStraight(nums []int) bool {
	quick(nums, 0, len(nums)-1)
	var joker = 0 //拥有,需要几张王
	//判断有几张王
	for i := 0; i < 4; i++ {
		if nums[i] == 0 {
			joker++
		} else if nums[i] == nums[i+1] {
			return false
		}
	}
	/*
		1.没有joker，得到的牌为五张各不相同的牌，并且我们已经经过了排序，所以此时nums[4]-nums[0]一定是大于等于4的，
		且只有在等于4时构成顺子，所以条件可写为nums[4]-nums[0]<5，joker为0，进一步写为nums[4]-nums[joker]<5

		2.有joker，不管有几张joker，剩余的牌要么是连续的，要么是中间缺了的。连续的自然一定可以构成顺子，非连续的也要
		要求最后一张减去第一张要小于5，因为头尾相差一旦大于等于5，比如出现1,6这种情况，不论有几张joker都是无法构成顺子的。
		综上，最后的判断写为nums[4]-nums[joker]<5
	*/
	return nums[4]-nums[joker] < 5
}

func quick(num []int, start, end int) {
	if start < end {
		i, j := start, end
		key := num[(start+end)/2]
		if i <= j {
			for num[i] < key {
				i++
			}
			for key < num[j] {
				j--
			}
			if i <= j {
				num[i], num[j] = num[j], num[i]
				i++
				j--
			}
		}
		if start < j {
			quick(num, start, j)
		}
		if i < end {
			quick(num, i, end)
		}
	}
}

func main() {
	n := []int{0, 0, 0}
	fmt.Println(isStraight(n))
}
